#ifndef __QUEUE__
#define __QUEUE__

#include<stdio.h>
#include<stdlib.h>
/**
 * 首先声明一个队列，以供后面使用
 */
typedef struct _QUEUE_NODE_
{
    struct _QUEUE_NODE_ * next;
    int data;
    /* data */
}QueueNode;

typedef struct __QUEUE__
{
    QueueNode* head;
    QueueNode* tail;
}Queue;

void initQueue(Queue *q){
    q->head=NULL;
    q->tail=NULL;
}

int emptyQueue(const Queue q){
    if(q.head==NULL&&q.tail==NULL){
        return 1;
    }
    if(q.head==NULL && q.tail!=NULL){
        return 1;
    }
    return 0;

}

void pushQueue(Queue *q,int val){
    if(q->tail==NULL&&q->head==NULL){
        q->tail=(QueueNode*)malloc(sizeof(QueueNode));
        q->tail->next=NULL;
        q->head=q->tail;
    }else if(q->tail!=NULL&&q->head==NULL){
        q->tail->next=(QueueNode*)malloc(sizeof(QueueNode));
        q->head=q->tail->next;
        q->tail->next->data=val;
        q->tail=q->tail->next;
        q->tail->next=NULL;
    }
    else{
        q->tail->next=(QueueNode*)malloc(sizeof(QueueNode));
        q->tail->next->data=val;
        q->tail=q->tail->next;
        q->tail->next=NULL;
    }
    
}
int popQueue(Queue *q){
    if(q->head!=NULL){
        int data=q->head->data;
        q->head=q->head->next;
        return data;
    }
    return -1;
}

void showQueue(const Queue q){
    QueueNode* temp=q.head;
    while (temp!=NULL)
    {   
        printf("%d ",temp->data);
        temp=temp->next;
    }
    printf("\n");
    
}
// int main(void){
//     const int test_size=10;
//     int test[]={0,1,2,3,4,5,6,7,8,9};
//     Queue q;
//     initQueue(&q);
//     for(int i=0;i<test_size;i++){
//         push(&q,test[i]);
//     }
    
//     showQueue(q);
//     for(int i=0;i<=test_size;i++){
//         int data=pop(&q);
//         printf("data: %d\n",data);
//         showQueue(q);
//     }


//     for(int i=0;i<test_size;i++){
//         push(&q,test[i]);
//     }
    
//     showQueue(q);
//     for(int i=0;i<=test_size;i++){
//         int data=pop(&q);
//         printf("data: %d\n",data);
//         showQueue(q);
//     }
    

//     return 0;
// }

#endif